package Fiad;

import gui.controller.ControllerHauptmenue;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import service.Ausbilder.AusbilderService;
import service.Ausbilder.AusbilderServiceImpl;
import service.Azubi.AzubiService;
import service.Azubi.AzubiServiceImpl;
import service.Azubi_Kurs.Azubi_KursService;
import service.Azubi_Kurs.Azubi_KursServiceImpl;
import service.Betrieb.BetriebService;
import service.Betrieb.BetriebServiceImpl;
import service.Bewertung.BewertungService;
import service.Bewertung.BewertungServiceImpl;
import service.Fach.FachService;
import service.Fach.FachServiceImpl;
import service.Klasse.KlasseService;
import service.Klasse.KlasseServiceImpl;
import service.Kurs.KursService;
import service.Kurs.KursServiceImpl;
import service.Lehrer.LehrerService;
import service.Lehrer.LehrerServiceImpl;
import service.Zeugnis.ZeugnisService;
import service.Zeugnis.ZeugnisServiceImpl;
import valueobjects.Ausbilder.Ausbilder;
import valueobjects.Azubi.Azubi;
import valueobjects.Azubi.AzubiImpl;
import valueobjects.Azubi_Kurs.Azubi_Kurs;
import valueobjects.Betrieb.Betrieb;
import valueobjects.Bewertung.Bewertung;
import valueobjects.Fach.Fach;
import valueobjects.Klasse.Klasse;
import valueobjects.Kurs.Kurs;
import valueobjects.Lehrer.Lehrer;
import valueobjects.Zeugnis.Zeugnis;

/**
 * Implementierung von {@link FIAD}.
 * 
 * @author Kevin
 * 
 */
public class FIADImpl implements FIAD {

	// Services
	private ZeugnisService zeugnisService = new ZeugnisServiceImpl();
	private LehrerService lehrerService = new LehrerServiceImpl();
	private BetriebService betriebService = new BetriebServiceImpl();
	private AusbilderService ausbilderService = new AusbilderServiceImpl(this);
	private KlasseService klasseService = new KlasseServiceImpl(this);
	private AzubiService azubiService = new AzubiServiceImpl(this);
	private FachService fachService = new FachServiceImpl();
	private KursService kursService = new KursServiceImpl();
	private BewertungService bewertungService = new BewertungServiceImpl();
	private Azubi_KursService azubi_KursService = new Azubi_KursServiceImpl(
			this);

	// Daten
	private List<Lehrer> alleLehrer = null;
	private List<Zeugnis> alleZeugnisse = null;
	private List<Betrieb> alleBetriebe = null;
	private List<Ausbilder> alleAusbilder = null;
	private List<Klasse> alleKlassen = null;
	private List<Azubi> alleAzubis = null;
	private List<Fach> alleFaecher = null;
	private List<Kurs> alleKurse = null;
	private List<Bewertung> alleBewertungen = null;
	private List<Azubi_Kurs> alleAzubi_Kurse = null;

	public FIADImpl() {
		this.holeAlleDaten();
		ControllerHauptmenue ha = new ControllerHauptmenue(this);

	}

	@Override
	public void holeAlleDaten() {
		// Reihenfolge wichtig:

		this.holeAlleLehrer();
		this.holeAlleZeugnisse();
		this.holeAlleBetriebe();
		this.holeAlleAusbilder();
		this.holeAlleKlassen();
		this.holeAlleAzubis();
		this.holeAlleFaecher();
		this.holeAlleKurse();
		this.holeAlleAzubi_Kurs();

	}

	@Override
	public void holeAlleKurse() {
		this.alleKurse = this.kursService.holeAlleKurse();
		if (this.alleKurse == null) {
			this.alleKurse = new ArrayList<Kurs>();
		}
	}

	@Override
	public List<Lehrer> holeAlleLehrer() {
		this.alleLehrer = this.lehrerService.holeAlleLehrer();
		if (this.alleLehrer == null) {
			this.alleLehrer = new ArrayList<Lehrer>();
		}
		return this.alleLehrer;

	}

	@Override
	public List<Zeugnis> holeAlleZeugnisse() {
		this.alleZeugnisse = this.zeugnisService.holeAlleZeugnisse();
		if (this.alleZeugnisse == null) {
			this.alleZeugnisse = new ArrayList<Zeugnis>();
		}

		return this.alleZeugnisse;
	}

	@Override
	public List<Azubi> holeAlleAzubis() {

		this.alleAzubis = this.azubiService.holeAlleAzubis();
		if (this.alleAzubis == null) {
			this.alleAzubis = new ArrayList<Azubi>();
		}
		return this.alleAzubis;

	}

	@Override
	public List<Betrieb> holeAlleBetriebe() {
		this.alleBetriebe = this.betriebService.holeAlleBetriebe();
		if (this.alleBetriebe == null) {
			this.alleBetriebe = new ArrayList<Betrieb>();
		}
		return this.alleBetriebe;
	}

	@Override
	public List<Klasse> holeAlleKlassen() {
		this.alleKlassen = this.klasseService.holeAlleKlassen();
		if (this.alleKlassen == null) {
			this.alleKlassen = new ArrayList<Klasse>();
		}
		return this.alleKlassen;
	}

	@Override
	public List<Ausbilder> holeAlleAusbilder() {
		this.alleAusbilder = this.ausbilderService.holeAlleAusbilder();
		if (this.alleAusbilder == null) {
			this.alleAusbilder = new ArrayList<Ausbilder>();
		}
		return this.alleAusbilder;
	}

	@Override
	public List<Fach> holeAlleFaecher() {
		this.alleFaecher = this.fachService.holeAlleFaecher();
		if (this.alleFaecher == null) {
			this.alleFaecher = new ArrayList<Fach>();
		}
		return this.alleFaecher;
	}

	@Override
	public void gibDatenAus() {

		for (Zeugnis zeugnis : this.alleZeugnisse) {
			System.out.println(zeugnis);
		}

		for (Lehrer lehrer : this.alleLehrer) {

			System.out.println(lehrer);
		}

		for (Azubi azubi : this.alleAzubis) {

			System.out.println(azubi);
		}

		for (Betrieb betrieb : this.alleBetriebe) {
			System.out.println(betrieb);
		}

		for (Klasse klasse : this.alleKlassen) {
			System.out.println(klasse);
		}

		for (Ausbilder ausbilder : this.alleAusbilder) {
			System.out.println(ausbilder);
		}

		for (Fach fach : this.alleFaecher) {
			System.out.println(fach);
		}

	}

	@Override
	public List<Lehrer> getAlleLehrer() {
		return alleLehrer;
	}

	@Override
	public List<Zeugnis> getAlleZeugnisse() {
		return alleZeugnisse;
	}

	@Override
	public List<Betrieb> getAlleBetriebe() {
		return alleBetriebe;
	}

	@Override
	public List<Ausbilder> getAlleAusbilder() {
		return alleAusbilder;
	}

	@Override
	public List<Klasse> getAlleKlassen() {
		return alleKlassen;
	}

	@Override
	public List<Azubi> getAlleAzubis() {
		return alleAzubis;
	}

	@Override
	public void speichereZeugnis(Zeugnis zeugnis) {
		this.zeugnisService.speichereZeugnis(zeugnis);
		this.holeAlleDaten();

	}

	@Override
	public void aendereZeugnis(Zeugnis zeugnis) {
		this.zeugnisService.aendereZeugnis(zeugnis);
		this.holeAlleDaten();
	}

	@Override
	public void loescheZeugnis(Zeugnis zeugnis) {
		this.zeugnisService.loescheZeugnis(zeugnis);
		this.holeAlleDaten();
	}

	@Override
	public void speichereAzubi(Azubi azubi) {
		this.azubiService.speichereAzubi(azubi);
		this.holeAlleDaten();
	}

	@Override
	public void aendereAzubi(Azubi azubi) {
		this.azubiService.aendereAzubi(azubi);
		this.holeAlleDaten();
	}

	@Override
	public void loescheAzubi(Azubi azubi) {
		this.azubiService.loescheAzubi(azubi);
		this.holeAlleDaten();
	}

	@Override
	public void speichereBetrieb(Betrieb betrieb) {
		this.betriebService.speichereBetrieb(betrieb);
		this.holeAlleDaten();
	}

	@Override
	public void aendereBetrieb(Betrieb betrieb) {
		this.betriebService.aendereBetrieb(betrieb);
		this.holeAlleDaten();
	}

	@Override
	public void loescheBetrieb(Betrieb betrieb) {
		this.betriebService.loescheBetrieb(betrieb);
		this.holeAlleDaten();
	}

	@Override
	public void speichereAusbilder(Ausbilder ausbilder) {
		this.ausbilderService.speichereAusbilder(ausbilder);
		this.holeAlleDaten();
	}

	@Override
	public void aendereAusbilder(Ausbilder ausbilder) {
		this.ausbilderService.aendereAusbilder(ausbilder);
		this.holeAlleDaten();
	}

	@Override
	public void loescheAusbilder(Ausbilder ausbilder) {
		this.ausbilderService.loescheAusbilder(ausbilder);
		this.holeAlleDaten();

	}

	@Override
	public void berechneNote(Azubi azubi, Fach fach) {
		List<Azubi_Kurs> relevant = new ArrayList<Azubi_Kurs>();

		for (Azubi_Kurs azubi_Kurs : this.alleAzubi_Kurse) {
			if (azubi_Kurs.getAzubi().equals(azubi)
					&& azubi_Kurs.getKurs().getFach().equals(fach)) {
				relevant.add(azubi_Kurs);
			}
		}
		Double notenvorschlag = 0.0;

		for (Azubi_Kurs azubi_Kurs : relevant) {

			notenvorschlag = notenvorschlag + azubi_Kurs.getNote();

		}

		notenvorschlag = notenvorschlag / relevant.size();
	}

	@Override
	public List<Fach> getAlleFaecher() {
		return alleFaecher;
	}

	@Override
	public List<Kurs> getAlleKurse() {
		return alleKurse;
	}

	@Override
	public List<Bewertung> getAlleBewertungen() {
		return alleBewertungen;
	}

	@Override
	public List<Azubi_Kurs> getAlleAzubi_Kurse() {
		return alleAzubi_Kurse;
	}

	@Override
	public void holeAlleBewertungen() {
		this.bewertungService.holeAlleBewertungen();

	}

	@Override
	public List<Azubi_Kurs> holeAlleAzubi_Kurs() {
		this.alleAzubi_Kurse = this.azubi_KursService.holeAlleAzubi_Kurs();

		return this.alleAzubi_Kurse;
	}

	@Override
	public void speichereAzubi_Kurs(Azubi_Kurs azubi_Kurs) {
		this.azubi_KursService.speichereAzubi_Kurs(azubi_Kurs);
	}

	@Override
	public void aendereAzubi_Kurs(Azubi_Kurs azubi_Kurs) {
		this.azubi_KursService.aendereAzubi_Kurs(azubi_Kurs);

	}

}
